package org.ceva.training.persistence.dao;

import org.ceva.training.persistence.bo.Course;
import org.ceva.training.persistence.bo.User;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.zkoss.lang.Strings;

public class CourseDAO extends HibernateDaoSupport {
	private static final Log log = LogFactory.getLog(CourseDAO.class);

	// property constants
	public static final String COURSENAME = "Coursename";
	public static final String STATUS = "status";

	protected void initDao() {
		// do nothing
	}
	/** Generate query string */ 
	public String generateQueryString(String where, String orderBy) {
		final StringBuffer sb = new StringBuffer(256);
		sb.append("FROM " + Course.class.getName());
		if (!Strings.isBlank(where)) {
			sb.append(" WHERE "+where);
		}
		if (!Strings.isBlank(orderBy)) {
			sb.append(" ORDER BY "+orderBy);
		}
		return sb.toString();
	}
	public List<Course> find(String queryString, int startLimit, int noOfRecords) {
		log.debug("finding all Course instances");
		try {
			
			HibernateTemplate template=getHibernateTemplate();			
			int setMaxRecords = startLimit + noOfRecords + 1;
			logger.info("Set Max Result "+ setMaxRecords);
			template.setMaxResults(setMaxRecords);
			List result = template.find(queryString);
			List finalResult = new ArrayList();
			int count = result.size()-startLimit;
			if( count < noOfRecords) {
				noOfRecords = count;
			}
			int i=0;
			logger.info("Start Count "+startLimit + ".Records Accessed "+noOfRecords);
			while (noOfRecords > i) {
				logger.info("Start Count "+startLimit+i+",Rdcord "+result.get(startLimit+i));
				finalResult.add(result.get(startLimit+i));
				i++;
			}
			return finalResult;				
		} catch (RuntimeException re) {
			log.error("find all failed", re);
			throw re;
		}
	}
	public void save(Course transientInstance) {
		log.debug("saving Course instance");
		try {
			getHibernateTemplate().save(transientInstance);
			log.debug("save successful");
		} catch (RuntimeException re) {
			log.error("save failed", re);
			throw re;
		}
	}

	public void delete(Course persistentInstance) {
		log.debug("deleting Course instance");
		try {
			getHibernateTemplate().delete(persistentInstance);
			log.debug("delete successful");
		} catch (RuntimeException re) {
			log.error("delete failed", re);
			throw re;
		}
	}

	public Course findById(Long id) {
		log.debug("getting Course instance with id: " + id);
		try {
			Course instance = (Course) getHibernateTemplate().get(
					"Course", id);
			return instance;
		} catch (RuntimeException re) {
			log.error("get failed", re);
			throw re;
		}
	}

	public List findByExample(Course instance) {
		log.debug("finding Course instance by example");
		try {
			List results = getHibernateTemplate().findByExample(instance);
			log.debug("find by example successful, result size: "
					+ results.size());
			return results;
		} catch (RuntimeException re) {
			log.error("find by example failed", re);
			throw re;
		}
	}

	public List findByProperty(String propertyName, Object value) {
		log.debug("finding Course instance with property: " + propertyName
				+ ", value: " + value);
		try {
			String queryString = "from Course as model where model."
					+ propertyName + "= ?";
			return getHibernateTemplate().find(queryString, value);
		} catch (RuntimeException re) {
			log.error("find by property name failed", re);
			throw re;
		}
	}

	public List findAll() {
		log.debug("finding all Course instances");
		try {
			String queryString = "from Course";
			return getHibernateTemplate().find(queryString);
		} catch (RuntimeException re) {
			log.error("find all failed", re);
			throw re;
		}
	}

	public Course merge(Course detachedInstance) {
		log.debug("merging Course instance");
		try {
			Course result = (Course) getHibernateTemplate().merge(
					detachedInstance);
			log.debug("merge successful");
			return result;
		} catch (RuntimeException re) {
			log.error("merge failed", re);
			throw re;
		}
	}

	public void attachDirty(Course instance) {
		log.debug("attaching dirty Course instance");
		try {
			getHibernateTemplate().saveOrUpdate(instance);
			log.debug("attach successful");
		} catch (RuntimeException re) {
			log.error("attach failed", re);
			throw re;
		}
	}

	public void attachClean(Course instance) {
		log.debug("attaching clean Course instance");
		try {
			getHibernateTemplate().lock(instance, LockMode.NONE);
			log.debug("attach successful");
		} catch (RuntimeException re) {
			log.error("attach failed", re);
			throw re;
		}
	}

	public static CourseDAO getFromApplicationContext(
			ApplicationContext ctx) {
		return (CourseDAO) ctx.getBean("CourseDAO");
	}
}